package sustav.izvor;

import java.util.Random;

/**
 * Razred izvor simulira izvor naseg komunikacijskog sustava.Izvor
 * se prilikom instanciranja mora inicijalizirati valjanim poljima
 * simbola koje zelimo da kodira, i vjerojatnosti njihovih pojavljivanja.
 * 
 * Nakon inicijaliziranja izvor je spreman generirati sljed od n
 * simbola sukladno predanim parametrima.
 * 
 * Kada izvor generira simbol,isti salje razredu Predajnik na daljnju
 * obradu.
 * 
 * @author Martin Morava
 *
 */
public class Izvor {
	
	/**
	 * Izvor sadrzi dvije privatne variable.Polje simbola, te
	 * polje pripadajucih vjerojatnosti  pojavljivanja.Vrjednosti
	 * su simetricne tako da prvi elemnt u polju vjerojatnosti
	 * pripada vjerojatnosti prvog elementa u polju simbola,
	 * drugi drugome itd... itd.
	 */
	private char[] simboli;
	private float[] vjerojatnostSimbola, stvarnaVjerojatnostSimbola;
	
	/**
	 * Defaultni konstruktor
	 * 
	 * @param simboli Simboli koje zelimo da izvor generira
	 * @param vjerojatnostSimbola Vjerojatnost pojave svakog simbola
	 * @param predajnik Predjnik kojemu se generirani simboli prosljeduju
	 */
	
	public Izvor(char[] simboli,float[] vjeorjatnostSimbola){
		this.simboli=simboli;
		this.vjerojatnostSimbola=vjeorjatnostSimbola;
		this.stvarnaVjerojatnostSimbola=new float[simboli.length];
		
	}
	
	
	/**
	 * Generira niz simbola odnosno poruku
	 * 
	 * @param duljinaNizaSimbola
	 * 
	 * @return Vraca generirani niz simobla
	 */
	public char[] generirajNizSimbola(int n){
		
		char[] nizSimbola=new char[n];
		int[] granicaSimbola=new int[simboli.length];
		int proslaGranica=0;
		Random rand=new Random();
		int tmp;
		
		//Postavi granice radi raspoznavanja generiranog simbola
		for(int i=0;i<simboli.length;i++){
			granicaSimbola[i]=proslaGranica+(int)(vjerojatnostSimbola[i]*100);
			proslaGranica=granicaSimbola[i];
		}
		
		//Generiraj poruku
		for(int i=0;i<n;i++){
			tmp=Math.abs(rand.nextInt()%101);
			
			proslaGranica=0;
			for(int j=0;j<simboli.length;j++){
				if ((tmp>=proslaGranica)&&(tmp<=((int)(vjerojatnostSimbola[j]*100)+proslaGranica))){
					
					nizSimbola[i]=simboli[j];
					stvarnaVjerojatnostSimbola[j]+=(float)1/n;
					break;
				}
				else{
					proslaGranica=proslaGranica+(int)(vjerojatnostSimbola[j]*100);
				}
				
			}
			
		}
		return nizSimbola;}


	public float[] getStvarnaVjerojatnostSimbola() {
		return stvarnaVjerojatnostSimbola;
	}

	
}
